/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     struct ListNode *next;

 * };

 */

// 寻找链表的中间节点
// 这道题目可以使用快慢指针解决
// 就是说我们定义一个慢指针,定义一个快指针
// 慢指针每次走一步,快指针每次走两步,那么快指针的路程每次都会是慢指针的两倍
// 当我们的快指针走到节点的末尾或者走到NULL的时候,慢指针就是这个节点的中间节点了

typedef struct ListNode ListNode ;

struct ListNode* middleNode(struct ListNode* head) 

{

    ListNode* slow ;

    ListNode* fast ;

    slow = fast = head ;

    while (fast && fast -> next) // 这里循环条件比较特殊,因为防止解引用造成非法访问内存,所以当快指针到NULL或者尾节点的时候就停止了
    {

        slow = slow -> next ;

        fast = fast -> next -> next ; // 这里可以允许多重解引用

    }

    return slow ;

}